# java-shareit
Двухмодульное приложение-микросервис для обмена вещами.

Состоит из трех микросервисов - gateway, server, БД. Каждый микросервис поднимается в отдельном docker-контейнере.

Данный проект даёт возможность пользователям:
 * рассказывать, какими вещами они готовы поделиться;
 * находить нужную вещь;
 * брать её в аренду на какое-то время;
 * позволять бронировать вещь на определённые даты;
 * закрывать к ней доступ на время бронирования от других желающих.

### Цели проекта

В этом проекте отрабатывалось практическое применение
* микросервисной архитектуры 
* контейнеризации через Docker
* работы с БД через JPA Hibernate
* транзакций
* Mockito тестирования

### Стек:
- Java 11 (Core, Collections, Optional, Stream)
- Spring Boot
- Hibernate
- PostgreSQL
- Maven
- Lombok, MapStruct
- Junit5, Mockito
- Postman
- Docker

## Endpoints

### Users
- `[GET] /users` – получить список всех пользователей
- `[GET] /users/{id}` – получить пользователя `id`
- `[POST] /users` – создать нового пользователя
- `[PATCH] /users/{id}` – обновить пользователя `id`
- `[DELETE] /users/{id}` - удалить пользователя `id`

### Items
Идентификатор пользователя передается в заголовке `X-Sharer-User-Id`
- `[GET] /items?from={from}&size={size}` – получить постраничный список всех вещей пользователя (с комментариями)
- `[GET] /items/{id}` – получить вещь `id` (с комментариями)
- `[POST] /items` – создать вещь и привязать к текущему пользователю
- `[PUT] /items/{id}` – обновить вещь `id` текущего пользователя
- `[DELETE] /items/{id}` - удалить вещь `id` текущего пользователя
- `[GET] /items/search?text={text}&from={from}&size={size}` – найти и вывести постранично все вещи, 
имеющие `text` в имени или описании, и доступные для запроса
- `[POST] /items/{id}/comment` – оставить комментарий после использования вещи `id`

### Booking
Идентификатор пользователя передается в заголовке `X-Sharer-User-Id`
- `[GET] /bookings?state={state}&from={from}&size={size}` – получить постранично список всех бронирований 
пользователя со статусом `state`
- `[GET] /bookings/{id}` – получить бронирование `id` (доступно только владельцу вещи 
и автору бронирования)
- `[GET] /bookings/owner?state={state}&from={from}&size={size}` – получить постранично список всех бронирований 
всех вещей владельца со статусом `state`
- `[POST] /bookings` – забронировать вещь
- `[PATCH] /bookings/{id}` – обновить статус бронирования вещи `id`

### Request
Идентификатор пользователя передается в заголовке `X-Sharer-User-Id`
- `[POST] /requests` – создать новый запрос вещи
- `[GET] /requests` – получить список запросов текущего пользователя (с ответами на них)
- `[GET] /requests/{id}` – получить запрос `id` (с ответами на него)
- `[GET] /requests/all?from={from}&size={size}` – получить постраничный список запросов, 
созданных другими пользователями (с ответами на них)
